<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
      /*回调函数
        优点：简单、容易理解
        缺点：不利于维护，代码耦合高

        事件监听（采用时间驱动模式，取决于某个事件是否发生）：
        优点：容易理解，可以绑定多个事件，每个事件可以指定多个回调函数
        缺点：事件驱动型，流程不够清晰

        发布/订阅（观察者模式）
        类似于事件监听，但是可以通过‘消息中心’，了解现在有多少发布者，多少订阅者

        Promise 对象
        优点：可以利用 then 方法，进行链式写法；可以书写错误时的回调函数；
        缺点：编写和理解，相对比较难

        Generator 函数
        优点：函数体内外的数据交换、错误处理机制
        缺点：流程管理不方便

        async 函数
        优点：内置执行器、更好的语义、更广的适用性、返回的是 Promise、结构清晰。
        缺点：错误处理机制
     */
    //回答 
    //js 中的异步机制可以分为以下几种：
    // 第一种最常见的是使用回调函数的方式，
    //     使用回调函数的方式有一个缺点是，多个回调函数嵌套的时候会造成回调函数地狱，上下两层的回调函数间的代码耦合度太高，不利于代码的可维护。

    // 第二种是 Promise 的方式，
    //     使用 Promise 的方式可以将嵌套的回调函数作为链式调用。但是使用这种方法，有时会造成多个 then 的链式调用，可能会造成代码的语义不够明确。

    // 第三种是使用 generator 的方式，
    //     它可以在函数的执行过程中，将函数的执行权转移出去，在函数外部我们还可以将执行权转移回来。
    //     当我们遇到异步函数执行的时候，将函数执行权转移出去，当异步函数执行完毕的时候我们再将执行权给转移回来。
    //     因此我们在 generator 内部对于异步操作的方式，可以以同步的顺序来书写。
    //     使用这种方式我们需要考虑的问题是何时将函数的控制权转移回来，因此我们需要有一个自动执行 generator 的机制，比如说 co 模块等方式来实现 generator 的自动执行。

    // 第四种是使用 async 函数的形式，
    //         async 函数是 generator 和 promise 实现的一个自动执行的语法糖，它内部自带执行器，
    //         当函数内部执行到一个 await 语句的时候，如果语句返回一个 promise 对象，那么函数将会等待 promise 对象的状态变为 resolve 后再继续向下执行。
    //         因此我们可以将异步逻辑，转化为同步的顺序来书写，并且这个函数可以自动执行。 




</script>